`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: CBICR, Tsinghua Univ.
// Engineer: Hongyi Li
// 
// Create Date: 2024/12/23 12:24:54
// Design Name: 
// Module Name: Route Compute
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module RtrComp
(
    input        clk, rst_n,
    input        i_valid,
    input  [5:0] i_core_id, // 3 bits (Y) | 3 bits (X)
    input  [5:0] i_dst,     // 6 bits * 5 directions
    output [4:0] o_dir      // 5 bits * 5 directions (EWNSL -> 3-bits)
    //  x -------------------------------------->
    //  y             N(2 -> Y-1)
    //  |
    //  | W(1 -> X-1) L(4 -> Ejt)  E(0 -> X+1)
    //  |
    //  V             S(3 -> Y+1)
);

wire [2:0] x_cur, y_cur, x_dst, y_dst;
wire [4:0] nxt_dir;
reg  [4:0] dir_reg;

assign x_cur = i_core_id[2:0];
assign y_cur = i_core_id[5:3];
assign x_dst = i_dst[2:0];
assign y_dst = i_dst[5:3];

// XY-Routing
assign nxt_dir = (~ i_valid)    ? 5'b00000 :
                (x_cur < x_dst) ? 5'b00001 :
                (x_cur > x_dst) ? 5'b00010 : 
                (y_cur > y_dst) ? 5'b00100 : 
                (y_cur < y_dst) ? 5'b01000 : 
                                  5'b10000;
assign o_dir = dir_reg;

always @(posedge clk) begin
    if (~rst_n)
        dir_reg <= 5'b0;
    else
        dir_reg <= nxt_dir;
end

endmodule